home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / lnd.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  4KB  |  222 lines

  1. /* -------------------------------- lnd.c ----------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Read in the *.lnd file.
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12.  
  13. LOCAL_FUNC int NEAR    lnd_read1 (FILE *vxfile, char *line, int name);
  14.  
  15. static struct {
  16.     short    name;
  17.     Ushort    color;
  18.     LVECT    R;
  19.     AVECT    a;
  20. } Tlnd;
  21.  
  22. #define READFLD        Tlnd
  23.  
  24. static struct FldTab FAR LndTbl[] = {
  25.     READI (name),
  26.     READI (color),
  27.     READI (R[X]),
  28.     READI (R[Y]),
  29.     READI (R[Z]),
  30.     READI (a[X]),
  31.     READI (a[Y]),
  32.     READI (a[Z]),
  33. {0, 0}};
  34.  
  35. #undef READFLD
  36.  
  37. extern int FAR
  38. lnd_read (void)
  39. {
  40.     int    i, n;
  41.     int    nlocals;
  42.     OBJECT    *p;
  43.     FILE    *ifile;
  44.     char    line[256];
  45.  
  46.     if (!st.lndname)
  47.         st.lndname = STRdup ("fly");
  48.  
  49.     Sys->BuildFileName (st.filename, st.fdir, st.lndname, LND_EXT);
  50.     if (!(ifile = fopen (st.filename, RTMODE))) {
  51.         LogPrintf ("%s: missing land file\n", st.filename);
  52.         return (-1);
  53.     }
  54.     LogPrintf ("Land     %s\n", st.filename);
  55.  
  56.     st.lineno = 0;
  57.     nlocals = 0;
  58.  
  59.     for (n = 0;; ++n) {
  60.         if (field_read (ifile, &LndTbl[0], line) < 0)
  61.             break;
  62.         if (O_EOF == Tlnd.name)
  63.             break;
  64.         else if (Tlnd.name & O_DEFINE) {
  65.             Tlnd.name = O_LOCAL + (Tlnd.name & ~O_DEFINE);
  66.             if (Tlnd.name < O_LOCAL || Tlnd.name >= O_INT+O_EXT) {
  67.                 LogPrintf ("%s %ld: bad object name\n",
  68.                     st.filename, st.lineno);
  69.                 goto badret;
  70.             }
  71.             if (lnd_read1 (ifile, line, Tlnd.name))
  72.                 goto badret;
  73.             ++nlocals;
  74.             continue;
  75.         }
  76.         if (Tlnd.name < 0 || Tlnd.name >= O_INT+O_EXT ||
  77.             !st.bodies[Tlnd.name]) {
  78.             LogPrintf ("%s %ld: bad object name\n",
  79.                 st.filename, st.lineno);
  80.             goto badret;
  81.         }
  82.         for (i = 1; LndTbl[i].type > 0; ++i) {
  83.             if (field_read (ifile, &LndTbl[i], line) < 0)
  84.                 goto badret;
  85.         }
  86.         Tlnd.a[Z] = -Tlnd.a[Z];
  87.         p = create_land (Tlnd.name);
  88.         if (!p) {
  89.             LogPrintf ("%s %ld: create land failed\n",
  90.                 st.filename, st.lineno);
  91.             goto badret;
  92.         }
  93.         if ((Ushort)CC_DEFAULT != Tlnd.color)
  94.             p->color = Tlnd.color;
  95.         LVcopy (p->R, Tlnd.R);
  96.         LVcopy (p->a, Tlnd.a);
  97.         Mobj (p);
  98.     }
  99.     LogPrintf ("      created %d objects\n", n);
  100.     LogPrintf ("      defined %d locals\n", nlocals);
  101.  
  102.     fclose (ifile);
  103.     return (0);
  104. badret:
  105.     fclose (ifile);
  106.     return (-1);
  107. }
  108.  
  109. LOCAL_FUNC short NEAR
  110. lnd_getXYZ (long l, int fine)
  111. {
  112.     if (fine & V_METERS)
  113.         l /= VONE;
  114.     if (l > VMAX || l < -VMAX)
  115.         LogPrintf ("%s %ld: coordinate truncated\n",
  116.             st.filename, st.lineno);
  117.     return ((short)l);
  118. }
  119.  
  120. LOCAL_FUNC int NEAR
  121. lnd_read1 (FILE *vxfile, char *line, int name)
  122. {
  123.     int    i, n, fine;
  124.     long    l;
  125.     VERTEX    *vx;
  126.     BODY    *b;
  127.  
  128.     vx = 0;
  129.     b = 0;
  130.  
  131.     if (st.bodies[Tlnd.name]) {
  132.         LogPrintf ("%s %ld: object already defined\n",
  133.             st.filename, st.lineno);
  134.         goto badret;
  135.     }
  136.  
  137.     if (field_long (vxfile, line, &l))
  138.         goto badret;
  139.     if (l < 1 || l > 2) {
  140.         LogPrintf ("%s %ld: bad detail level\n",
  141.             st.filename, st.lineno);
  142.         goto badret;
  143.     }
  144.     fine = (int)l;
  145.  
  146.     if (field_long (vxfile, line, &l))
  147.         goto badret;
  148.     if (l <= 0) {
  149.         LogPrintf ("%s %ld: bad shape size\n",
  150.             st.filename, st.lineno);
  151.         goto badret;
  152.     }
  153.     n = (int)l;
  154.  
  155.     vx = (VERTEX *)memory_calloc (sizeof (*vx), n+1);
  156.     if (!vx) {
  157.         LogPrintf ("%s %ld: no shape memory\n",
  158.             st.filename, st.lineno);
  159.         goto badret;
  160.     }
  161.  
  162.     for (i = 0; i < n; ++i) {
  163.         if (field_long (vxfile, line, &l))
  164.             goto badret;
  165.         vx[i].V[X] = lnd_getXYZ (l, fine);
  166.         if (field_long (vxfile, line, &l))
  167.             goto badret;
  168.         vx[i].V[Y] = lnd_getXYZ (l, fine);
  169.         if (field_long (vxfile, line, &l))
  170.             goto badret;
  171.         vx[i].V[Z] = lnd_getXYZ (l, fine);
  172.         if (field_long (vxfile, line, &l))
  173.             goto badret;
  174.         vx[i].flags = (short)l;
  175.     }
  176.  
  177.     vx[i].flags = V_EOF;    /* end of list */
  178.  
  179.     if (F(b = bodies_new (Tlnd.name))) {
  180.         LogPrintf ("%s %ld: no body\n",
  181.             st.filename, st.lineno);
  182.         goto badret;
  183.     }
  184.  
  185.     if (!NEW (b->shape)) {
  186.         LogPrintf ("%s %ld: no shape\n",
  187.             st.filename, st.lineno);
  188.         goto badret;
  189.     }
  190.     b->flags |= BO_DYNSHAPE;
  191.     b->shape->flags |= SH_DYNVERTEX;
  192.  
  193.     b->shape->v = vx;
  194.     if (fine & V_FINE)
  195.         b->shape->flags |= SH_FINE;
  196.  
  197.     b->title = "LOCAL";
  198.     b->shape->weight = 1L;
  199.     b->shape->drag = 0;
  200.  
  201.     b->init = gen_init;
  202.     b->term = gen_term;
  203.     b->create = gen_create;
  204.     b->delete = gen_delete;
  205.     b->dynamics = gen_nodynamics;
  206.     b->hit = gen_nohit;
  207.  
  208.     bodies_extent (b->name);
  209.  
  210.     LogPrintf ("      local %d size %d\n", Tlnd.name-O_LOCAL, n);
  211.  
  212.     return (0);
  213. badret:
  214.     if (b) {
  215.         if (b->shape)
  216.             DEL0 (b->shape);
  217.         bodies_del (b->name);
  218.     }
  219.     shape_free (vx);
  220.     return (-1);
  221. }
  222.